from django.shortcuts import render
from django.views import View
from django.http import *
from django_redis import get_redis_connection
import re,logging,random,json

from verifications.libs.captcha.captcha import captcha
from aijia.utils.response_code import RETCODE
from aijia.celery_tasks.sms.tasks import ccp_send_sms_code

logger = logging.getLogger('django')

class ImageView(View):   # 路由后加/会请求两次？
    '''图形验证码'''
    #存在BUG，路由后加/会请求两次，一次是重定向，一次是正常请求，第一次一切正常，既能存入数据库，也能返回image图片
    # 第二次请求能将数据存入redis数据库，但不返回image图片
    def get(self,request):
        # 接收参数
        cur = request.GET.get('cur')
        pre = request.GET.get('pre')  # 有何作用
        # # 校验参数
        if not cur:
            return HttpResponseForbidden({
                'errno':RETCODE.PARAMERR,
                'errmsg':'缺少参数'
            })

        # 业务逻辑
        text,image = captcha.generate_captcha()  # 生成图形验证码
        # 将验证码编号存入数据库
        redis_conn = get_redis_connection('verify_code')
        redis_conn.setex('img_%s' %cur,60,text)
        # 返回参数
        return HttpResponse(image,content_type='image/jpg')

class SmsCodeView(View):
    '''短信验证'''
    def post(self,request):

        # 接收参数
        json_dict = json.loads(request.body.decode())
        id = json_dict.get('id')
        mobile = json_dict.get('mobile')
        text = json_dict.get('text')
        # 校验参数
        if not all([id,mobile,text]):
            return HttpResponseForbidden({
                'errno':RETCODE.PARAMERR,
                'errmsg':'缺少参数'
            })
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return HttpResponseForbidden({
                'errno': RETCODE.PARAMERR,
                'errmsg': '请输入正确手机号'
            })
        if not re.match(r'^[0-9A-Za-z]{4}$', text):
            return HttpResponseForbidden({
                'errno': RETCODE.PARAMERR,
                'errmsg': '请输入正确验证码'
            })
        # 实现逻辑
        # 查询redis数据库
        redis_conn = get_redis_connection('verify_code')
        # 提取验证码
        image_code = redis_conn.get('img_%s' %id)
        # 判断其是否过期
        if image_code is None:
            return HttpResponseForbidden({
                'errno':RETCODE.NODATA,
                'errmsg':'图形码已过期'
            })
        # 如果存在，删除验证码
        try:
            redis_conn.delete('img_%s' %id)
        except Exception as e:
            logger.error(e)
        # 从数据库中查询的为btys数据，转换为字符串数据
        image_code = image_code.decode()
        # 对比验证码
        if image_code.lower() != text.lower():
            return HttpResponseServerError({
                'errno':RETCODE.PARAMERR,
                'errmsg':'图形码错误'
            })
        # 生成短信验证码
        sms_code = '%06d' % random.randint(0,999999)
        # 短信验证码保存在日志中
        logger.info(sms_code)
        # 短信验证码保存到数据库中
        redis_conn.setex('mobile_%s' % mobile,60,sms_code)
        # 对比成功使用celery异步发送短信
        ccp_send_sms_code.delay(mobile,sms_code)
        # 返回参数
        return JsonResponse({
            'errno':RETCODE.OK,
            'errmsg':'OK'
        })